# 1. 导入所需库和数据集
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score  # 导入模型评估指标

# 2. 加载数据集并查看基本信息
housing = fetch_california_housing()  # 加载数据集，返回Bunch对象（类似字典）
# print(housing)
X = housing.data  # 特征矩阵：shape=(20640, 8)，每行是1个区域的8个特征
y = housing.target  # 目标值：shape=(20640,)，每行是对应区域的房屋中位数价格
feature_names = housing.feature_names  # 特征名称列表，方便后续理解特征含义
print("特征名称：", feature_names)  # 输出：['MedInc', 'HouseAge', 'AveRooms', ..., 'Latitude', 'Longitude']

# 3. 拆分训练集和测试集（核心：避免过拟合）
# test_size=0.2：测试集占比20%，训练集占80%；random_state=42：固定随机种子，保证结果可复现
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 4. 初始化并训练线性回归模型
model = LinearRegression()  # 初始化模型（未带参数）
model.fit(X_train, y_train)  # 用训练集拟合模型：计算最优的w（权重）和b（截距）

# 5. 模型预测（用测试集验证泛化能力）
y_pred = model.predict(X_test)  # 对测试集特征预测目标值（房价）

# 6. 模型评估（判断预测效果）
mse = mean_squared_error(y_test, y_pred)  # 均方误差：越接近0，预测越准
rmse = mse ** 0.5  # 均方根误差：将MSE还原为与目标值同单位（万美元），更易理解
r2 = r2_score(y_test, y_pred)  # R²评分：0~1之间，越接近1说明模型解释力越强（1表示完美预测）

# 输出评估结果
print(f"测试集均方根误差（RMSE）：{rmse:.2f} 万美元")
print(f"测试集R²评分：{r2:.4f}")

# 查看模型参数（理解特征对房价的影响）
print("\n模型截距（b）：", model.intercept_)
print("特征权重（w）：")
for feat, weight in zip(feature_names, model.coef_):
    print(f"  {feat}: {weight:.4f}")  # 权重正负表示特征与房价的正负相关（如MedInc权重为正，收入越高房价越高）